﻿/*!
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using System;

namespace Pittypat
{
    /// <summary>
    /// 提供一组针对可空类型的扩展方法。
    /// </summary>
    public static class NullableExtensions
    {
        /// <summary>
        /// 将可空类型的值转换为其字符串形式。
        /// </summary>
        /// <typeparam name="T">目标值的类型。</typeparam>
        /// <param name="value">要转换的值。</param>
        /// <param name="format">格式化字符串。</param>
        /// <returns>使用指定格式化字符串对值格式化后的字符串。如果 value 为 null，则返回空字符串。</returns>
        public static string ToString<T>(this T? value, string format) where T : struct, IFormattable
        {
            return value.HasValue ? value.Value.ToString(format, null) : "";
        }

        /// <summary>
        /// 比较可空类型的值的大小。总是认为 null 小于目标类型的任何值。
        /// </summary>
        /// <typeparam name="T">值的类型。</typeparam>
        /// <param name="x">第一个值。</param>
        /// <param name="y">第二个值。</param>
        /// <returns>指示 x 与 y 大小的值。</returns>
        public static int CompareTo<T>(this T? x, T? y) where T : struct, IComparable
        {
            if (x.HasValue)
            {
                if (y.HasValue)
                {
                    return x.Value.CompareTo(y.Value);
                }

                return 1;
            }
            else
            {
                if (y.HasValue)
                {
                    return -1;
                }

                return 0;
            }
        }

        /// <summary>
        /// 判断一个值是否是空引用或数据库空值。
        /// </summary>
        /// <param name="value">要判断的值。</param>
        /// <returns>如果 value 是空引用或者数据库空值，则返回 true，否则返回 false。</returns>
        public static bool IsNullOrDBNull(this object value)
        {
            return value == null || value == DBNull.Value;
        }
    }
}
